#include"SList.h"

SListNode* BuySListNode(SListDataType data)
{
	SListNode* Node = (SListNode*)malloc(sizeof(SListNode));
	assert(Node);
	Node->_data = data;
	Node->_next = NULL;
	return Node;
}

void SListNodePushBcak(SListNode** phead, SListDataType data)
{
	if (*phead == NULL)
	{
		*phead = BuySListNode(data);
		return;
	}
	SListNode* tmp = *phead;
	while (tmp->_next != NULL)
	{
		tmp = tmp->_next;
	}
	tmp->_next = BuySListNode(data);
}
void SListNodePopBcak(SListNode* phead)
{
	if (phead == NULL)
	{
		return;
	}
	SListNode* BackNode = phead;
	while (phead->_next != NULL)
	{
		BackNode = phead;
		phead = phead->_next;
	}
	BackNode->_next = NULL;
	free(phead);
}
void SListNodePushFront(SListNode** phead, SListDataType data)
{
	if (*phead == NULL)
	{
		*phead = BuySListNode(data);
		return;
	}
	SListNode* newNode = BuySListNode(data);
	newNode->_next = *phead;
	*phead = newNode;
}
void SListNodePopFront(SListNode** phead)
{
	if (*phead == NULL)
	{
		return;
	}
	SListNode* tmp = *phead;
	*phead = (*phead)->_next;
	free(tmp);
}
void SListNodePrint(SListNode* phead)
{
	if (phead == NULL)
	{
		return;
	}
	while (phead != NULL)
	{
		printf("%d->", phead->_data);
		phead = phead->_next;
	}
	printf("NULL");
}
SListNode* SListNodeFind(SListNode* phead, SListDataType data)
{
	if (phead == NULL)
	{
		return;
	}
	while (phead != NULL)
	{
		if (phead->_data == data)
		{
			return phead;
		}
	}
	return NULL;
}

//void SListNodeInsertPrec(SListNode** pos, SListDataType data)
//{
//	if (*pos == NULL || (*pos)->_next == NULL)
//	{
//		SListNodePushFront(pos, data);
//		return;
//	}
//
//
//}
void SListNodeInsertLater(SListNode** pos, SListDataType data)
{
	if (*pos == NULL)
	{
		SListNodePushFront(pos, data);
		return;
	}
	SListNode* tmp = (*pos)->_next;
	SListNode* newNode = BuySListNode(data);
	newNode->_next = tmp;
	(*pos)->_next = newNode;
}
//void SListNodeErasePrec(SListNode** pos);
void SListNodeEraseLater(SListNode* pos)
{
	if (pos == NULL || pos->_next == NULL)
	{
		return;
	}
	SListNode* tmp = pos->_next;
	pos->_next = tmp->_next;
	free(tmp);

}